﻿// -----------------------------------------------------------------------
// <copyright file="ErrorModule.cs" company="Intellego">
//   Copyright © Intellego 2012
// </copyright>
// -----------------------------------------------------------------------

namespace MIAPWEB.Common.Modules
{
    using System;
    using System.Web;
    using System.Web.Configuration;

    /// <summary>
    /// Modulo para manejo de errores entre solicitudes HTTP.
    /// </summary>
    public class ErrorModule : IHttpModule
    {
        /// <summary>
        /// Maneja los errores ocurridos en las solicitudes HTTP.
        /// </summary>
        /// <param name="sender">Clase que invoca el evento.</param>
        /// <param name="e">Objeto EventArgs que contiene los datos del evento.</param>
        private void OnError(object sender, EventArgs e)
        {
            // Obtener la ultima excepción de la aplicación.
            var error = HttpContext.Current.Server.GetLastError() as HttpException;
            CustomErrorsSection config = (CustomErrorsSection)WebConfigurationManager.GetSection("system.web/customErrors");                

            // Manejo de excepción 404.
            if (error != null && error.GetHttpCode() == 404)
            {            
                HttpContext.Current.Response.StatusCode = 404;
                HttpContext.Current.Server.Transfer(config.Errors["404"].Redirect);
            }
            else
            {
                // Manejo de cualquier otro tipo de excepción.                
                HttpContext.Current.Server.Transfer(config.DefaultRedirect);
            }
        }

        #region Implementación de IHttpModule

        /// <summary>
        /// Inicializa un módulo y lo prepara para el control de solicitudes.
        /// </summary>
        /// <param name="context">Un objeto HttpApplication que proporciona acceso a los métodos, propiedades y eventos comunes a todos los objetos de aplicación existentes en una aplicación ASP.NET.</param>
        public void Init(HttpApplication context)
        {
            context.Error += this.OnError;
        }

        /// <summary>
        /// Elimina los recursos (distintos de la memoria) utilizados por el módulo que implementa IHttpModule.
        /// </summary>
        public void Dispose()
        {
        }

        #endregion
    }
}